package com.chap16;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * <code>ThreadPoolDemo</code>
 * </p>
 *
 * @author junbao3
 * TODO
 * @date 2023-04-25 10:39
 * Copyright (C) 2021 IFlyTek. All rights reserved.
 */
public class ThreadPoolDemo {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        //10个任务 5个线程，必然有5个任务在等待
        for (int i = 0; i < 10; i++) {
            executorService.submit(()->{
                try {
                    System.out.println(Thread.currentThread().getName()+"正在执行任务...");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    //重新设置中断状态
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }finally {
                    System.out.println(Thread.currentThread().getName()+"任务执行完毕");
                }
            });

        }

        //线程池不接受新任务，但是会处理已提交的任务
        executorService.shutdown();

        //等待线程池中的任务执行完毕或者超时时间到达
        //每个任务执行5秒，3秒的超时时间，就会进入if
        boolean termination = executorService.awaitTermination(3, TimeUnit.SECONDS);
        if (!termination){
            // 如果线程池中还有未执行完毕的任务，则调用线程池的shutdownNow方法，中断所有正在执行的任务
            // 如果有还没开始执行的任务，则返回未执行的任务列表
            //前面休眠的5个任务中断 后面5个任务返回
            List<Runnable> tasks = executorService.shutdownNow();
            System.out.println("剩余未执行的任务数："+tasks.size());
        }

    }
}
